namespace go device

/*设备IPC类型*/
enum IPCType {
    NVR = 1, //NVR
    IPC,     //IPC
    Guns,   //枪机
    Balls,  //球机
    Panorama, //全景相机
    MobileSurveillance, //移动监拍
    DRONES,  //无人机
    Robots, //机器人
    MobileApp, //手机APP
    AlarmDevice //智能报警设备
}

/*设备 品牌/厂家*/
enum BrandType {
    HAIKANG = 1,
    DAHUA,
    YUSHI,
}

/*视频推流方式*/
enum VideoStreamMode {
    RTSP = 1,
    SDK,
    ISUP,
}

/*修改信息
    接入方案ID：
        CONNECT_CENTER_HK_SDK_6.1.9.4
        CONNECT_CENTER_HK_EHOME_2.0
        CONNECT_CENTER_HK_EHOME_4.0
        CONNECT_CENTER_HK_ISUP_5.0
        CONNECT_CENTER_DH_SDK_3.055
*/

/*云台控制命令*/
enum PTZCMD {
    PTZ_UP = 0,       //向上
    PTZ_DOWN,         //向下
    PTZ_LEFT,         //向左
    PTZ_RIGHT,        //向右
    PTZ_UPLEFT,       //向左上
    PTZ_DOWNLEFT,     //向左下
    PTZ_UPRIGHT,      //向右上
    PTZ_DOWNRIGHT,    //向右下
    PTZ_ZOOMIN,       //变焦（缩小）
    PTZ_ZOOMOUT,      //变焦（放大）
    PTZ_FOCUSNEAR,    //聚焦-
    PTZ_FOCUSFAR,     //聚焦+
    PTZ_IRISSTARTUP,  //光圈变大
    PTZ_IRISSTOPDOWN, //光圈变小
    PTZ_FILL_LIGHT,   //补光灯
    PTZ_WIPER,        //雨刷
    PTZ_AUTO,         //自动
}

/*云台预置点操作类型*/
enum PTZPRESETCMD {
    PRESET_SET = 1, //设置预置点
    PRESET_CLEAR,   //清除预置点
    PRESET_GOTO,    //转到预置点
}

/*设备控制命令类型*/
enum ControlCmdType {
    RESPONSE_CMD = 1, /*有应答控制*/
    NO_RESPONSE_CMD,  /*无应答控制*/
}

/*订阅事件类型*/
enum SubscribeType {
    CATALOG_EVENT = 1, /*目录订阅*/
    ALARM_EVENT,       /*报警事件订阅*/
    MOBILE_POS_EVENT,  /*移动设备位置通知事件*/
}

/*
    报警都通过RocketMQ来实现
*/
// /*报警级别*/
// enum AlarmPriority {
//     PRIMARY_LEVEL_ALARM = 1,
//     SECONDARY_LEVEL_ALARM,
//     THRID_LEVEL_ALARM,
//     FOUR_LEVEL_ALARM,
// }

// /*报警方式*/
// enum AlarmMethod {
//     PHONE_ALARM = 1,
//     DEVICE_ALARM,
//     SMS_ALARM,
//     GPS_ALARM,
//     VIDEO_ALARM,
//     DEVICE_FAULT_ALARM,
//     OTHER_ALARM,
// }

// /*报警类型*/
// enum ALARM_TYPE {
//     ALARM_TYPE_DEPLOYMENT = 1, /*布防*/
//     ALARM_TYPE_MONITOR,        /*监听*/
// }

/*巡航控制命令类型*/
enum CruiseCmdType {
    SEQ_ADD_PRESET = 1, /*巡航序列中添加预设点*/
    SEQ_SET_DWELL,      /*设置巡航点停顿时间*/
    SEQ_SET_SPEED,      /*设置巡航速度*/
    SEQ_CLEAR_PRESET,   /*将预设点从巡航序列中删除*/
    SEQ_RUN,            /*开始巡航*/
    SEQ_STOP,           /*停止巡航*/
}

/*设备历史文件信息*/
struct DeviceHistoryList {
    1: string deviceSipID, /*设备ID*/
    2: i64 fileSize,       /* 文件大小 */
    3: string startTime,   /* 开始时间 */
    4: string endTime,     /* 结束时间 */
}

/*时间参数*/
struct Timeparam {
    1: i32 year,
    2: i32 month,
    3: i32 day,
    4: i32 hour,
    5: i32 minute,
    6: i32 second,
}

/*通道信息*/
struct ChannelInfo {
    1: i32 channelID,     /*通道号*/
    2: string cameraName, /*摄像头名称*/
    3: bool isAvailable,  /*是否可用*/
    4: i32 streamType,    /*0-主码流，1-子码流，2-3码流，3-虚拟码流4，以此类推*/
    5: i32 linkMode,      /*1- TCP方式，2- UDP方式，3- 多播方式，4- RTP方式，5-RTP/RTSP，6-RSTP/HTTP*/
    6: i32 protoType,     /*取流协议 0- 私有协议(默认)，1- RTSP协议*/
}

/*设备登录注册信息*/
struct DeviceLoginInfo {
    1: BrandType brandType,             /*品牌类型*/
    2: VideoStreamMode videoStreamMode, /*视频推流方式*/
    3: string protocVersion,            /*设备对应的sdk版本号*/
    4: string deviceIP,                 /*IP地址*/
    5: i32 devicePort,                  /*连接端口*/
    6: string userName,                 /*用户名*/
    7: string userPassword,             /*密码*/
    8: IPCType ipcType,                 /*设备IPC类型: nvr ipc 无人机*/
    9: bool isDirectConnect,            /*是否直连*/
    10: i32 channelID,                  /*通道号*/
    11: i32 parentChannel,              /*父级通道号*/
    12: string parentSipID,             /*父级SipID*/
    13: string connectSolutionID,       /*接入方案ID*/
}

/*设备连接*/
struct DeviceConnectRequest {
    1: string deviceSipID,
    2: i32 channelID,
    3: string mediaCenterIP,
    4: i32 mediaCenterPort,
    5: string app,
    6: string stream,
    7: Timeparam time,
    8: string tid,
}

/*设备断开连接*/
struct DeviceDisConnectParam {
    1: string deviceSipID,
    2: i32 channelID,
    3: string tid,
    4: bool bDelete,
}

/*心跳检测*/
struct HeartBeatCallbackParam {
    1: string ip,
    2: i32 port,
    3: i16 interval,
    4: i16 maxTimeOut,
    5: string tid,
}

/*实时预览*/
struct RealPlayParamParam {
    1: string deviceSipID,              //设备国标ID
    2: VideoStreamMode videoStreamMode, //视频推流方式
    3: ChannelInfo channel,             //通道信息
    4: string app,                      //应用名
    5: string stream,                   //流ID (停止流为SSRC)
    6: string mediaCenterIP,            //接收流数据的媒体中心IP
    7: i32 mediaCenterPort,             //接收流数据的媒体中心Port
    8: string tid,                      //事务ID
    9: IPCType ipcType,                 //设备IPC类型: 0_nvr 1_ipc 2_无人机
    10: bool isDirectConnect,           //是否直连
    11: string parentSipID,             //父级设备ID
    12: ChannelInfo parentChannel,      //父级设备通道信息
    13: bool IsIsBoxes,                 //是否有盒子
    14: string OuterMediaCenterIP,      //接收流数据的媒体中心IP
    15: i32 OuterMediaCenterPort,       //接收流数据的媒体中心Port
}

//
//struct StopRealPlayParam
//{
//    1:  string deviceSipID,            //设备国标ID
//    2:  i32 channelID,                 //设备通道号
//    3:  VideoStreamMode videoStreamMode,//视频推流方式
//    4:  IPCType ipcType,               //设备IPC类型: 0_nvr 1_ipc 2_无人机
//    5:  bool isDirectConnect,          //是否直连
//    6:  string parentSipID,            //父级设备ID
//    7:  i32 parentChannelID,           //父级设备通道信息
//    8:  string tid,                    //事务ID
//    9:  string mediaCenterIP,          //接收流数据的媒体中心IP
//}

/*视音频历史回放*/
struct PlayBackParam {
    1: string deviceSipID,         //设备国标ID
    2: string mediaCenterIP,       //接收流数据的媒体中心IP
    3: i32 mediaCenterPort,        //接收流数据的媒体中心Port
    4: Timeparam beginTime,        //回放开始时间
    5: Timeparam endTime,          //回放结束时间
    6: string app,                 //应用名
    7: string stream,              //流ID
    8: i32 channelID,              //通道号
    9: string tid,                 //事务ID
    10: IPCType ipcType,           //设备IPC类型: 0_nvr 1_ipc 2_无人机
    11: bool isDirectConnect,      //是否直连
    12: string parentSipID,        //父级设备ID
    13: i32 parentChannelID,       //父级设备通道号
    14: bool IsIsBoxes,            //是否有盒子
    15: string OuterMediaCenterIP, //接收流数据的媒体中心IP
    16: i32 OuterMediaCenterPort,  //接收流数据的媒体中心Port
    17: i32 OffsetTime,            //跳转偏移量
    18: string ScaleType,          //播放倍速类型
}

/*缩放控制*/
struct DragZoom {
    1: i64 Length,
    2: i64 Width,
    3: i64 MidPointX,
    4: i64 MidPointY,
    5: i64 LengthX,
    6: i64 WidthY,
}

// /*设备控制*/
// struct DeviceControl {
//     1: ControlCmdType cmdType,
//     2: string cmdSerialNum,
//     3: string deviceSipID,
//     4: i32 channelID,
//     5: DragZoom dragZoomIn,
//     6: DragZoom dragZoomOut,
//     7: string subMessage,
//     8: string tid,
// }

/*云台通用控制*/
struct PTZControl {
    1: string deviceSipID,              /*设备ID*/
    2: i32 channelID,                   /*通道号*/
    3: VideoStreamMode videoStreamMode, /*接入方式*/
    4: PTZCMD ptzCmd,                   /*云台控制命令*/
    5: i16 speed,                       /*PTZ 速度，值越大，代表速度越快*/
    6: i16 startStop,                   /*控制启停命令 0_开始动作 1_停止动作*/
    7: string tid,                      /*事务ID*/
    8: IPCType ipcType,                 /*设备IPC类型: 0_nvr 1_ipc 2_无人机*/
    9: bool isDirectConnect,            /*是否直连*/
    10: string parentSipID,             /*父级设备ID*/
    11: i32 parentChannelID,            /*父级设备通道号*/
}

/*云台预置点控制*/
struct PTZPresetControl {
    1: string deviceSipID,              /*设备ID*/
    2: i32 channelID,                   /*通道号*/
    3: VideoStreamMode videoStreamMode, /*接入方式*/
    4: PTZPRESETCMD presetCmd,          /*预置命令*/
    5: i32 presetIndex,                 /*预置点序号*/
    6: string tid,                      /*事务ID*/
    7: IPCType ipcType,                 /*设备IPC类型: 0_nvr 1_ipc 2_无人机*/
    8: bool isDirectConnect,            /*是否直连*/
    9: string parentSipID,              /*父级设备ID*/
    10: i32 parentChannelID,            /*父级设备通道号*/
}

/*设备预置点信息*/
struct DevicePresetInfo {
    1: i32 presetIndex, /*预置点序号*/
    2: double fX,       /*X坐标*/
    3: double fY,       /*Y坐标*/
    4: i32 zoom,        /*zoom值*/
}

/*预置点查询响应*/
struct PresetQueryResponse {
    1: i32 code,
    2: string msg,
    4: i32 presetTotalNum,                   /*预置点数量*/
    5: list<DevicePresetInfo> allPresetInfo, /*所有点的预置点信息*/
}

/*云台巡航控制信息*/
struct CruiseControlParam {
    1: string sipID,
    2: i32 channelID,
    3: VideoStreamMode videoStreamMode, /*接入方式*/
    4: CruiseCmdType cmdType,           /*巡航控制命令类型*/
    5: i32 cruiseRoute,                 /*巡航路径序号*/
    6: i32 cruisePoint,                 /*巡航点序号*/
    7: i32 data,                        /*参数值*/
    8: string tid,                      /*事务ID*/
}

/* 设备订阅参数 */
struct SubscribeParam {
    1: string deviceID, /* 设备id */
    2: i32 channelID    /* channelID */
    3: string parentSipID /* 父级设备id */
    4: i32 partentChannelID /* 父级设备channelID */
    5: i64 StartAlarmPriority, /* 起始报警级别 */
    6: i64 EndAlarmPriority, /* 终止报警级别 */
    7: i64 AlarmMethod, /* 报警方式 */
    8: string PicServer, /* 图片服务地址 */
    9: bool isCancel, /* 是否是取消订阅 */
}

// /*报警事件*/
// struct AlarmEvent {
//     1: string cmdType,       /*命令类型*/
//     2: string cmdSn,         /*命令序列号*/
//     3: string deviceSipID,   /*目标设备编码*/
//     4: i32 channelID,        /*通道号*/
//     5: string alarmPriority, /*报警级别*/
//     6: Timeparam alramTime,  /*报警时间*/
//     7: string alarmMethod,   /*报警方式*/
//     8: string longitude,     /*经度*/
//     9: string latitude,      /*纬度*/
//     10: string alarmType,    /*报警类型*
//     11:  string alarmTypeParam, /*报警类型参数*/
// }

// /*报警参数信息*/
// struct AlarmParam {
//     1: ALARM_TYPE type,    /*报警方式*/
//     2: i32 deployLevel,    /*布防等级*/
//     3: i32 uploadType,     /*报警上传类型*/
//     4: string deviceSipID, /*目标设备编码*/
//     5: string alarmHostIp, /*报警主机IP*/
//     6: i32 alarmHostPort,  /*报警主机端口*/
//     7: bool bEnable,       /*是否启用*/
//     8: string tid,         /*事务id*/
// }

/*设备信息*/
struct DeviceInfo {
    1: i32 code,                  /*查询结果*/
    2: string msg,                /*结果信息描述*/
    3: string deviceSipID,        /*设备ID*/
    4: string deviceName,         /*设备名称*/
    5: string manufacturer,       /*生产厂商*/
    6: string model,              /*设备型号*/
    7: string firmware,           /*固件版本*/
    8: i64 maxNumOfCameraSupport, /*最大支持摄像机个数*/
}

/*设备状态信息*/
struct DeviceStatusInfo {
    1: i32 code,
    2: string msg,
    3: string result,        /*查询结果*/
    4: bool bOnline,         /*是否在线*/
    5: i16 status,           /*设备工作状态*/
    6: string reason,        /*不正常原因*/
    7: bool bEncode,         /*是否编码*/
    8: bool bRecord,         /*是否录像*/
    9: Timeparam deviceTime, /*日期和时间*/
    10: string dutyStatus,   /*报警设备状态*/
}

/*通用答复*/
struct CommonResponse2 {
    1: i32 code,   /*处理结果代码 200_成功 500_失败*/
    2: string msg, /*处理结果提示信息*/
}

/*历史文件查询响应信息*/
struct QueryHisFilelistResponse {
    1: i32 code,
    2: string msg,
    3: list<DeviceHistoryList> hisFilelist,
}

struct PlayProtocol {
    1: string MediaServerHost,
    2: string SSRCStr,
    3: string App,
}

/*获取备用的设备接入信息*/
struct ConnectDeviceResponse {
    1: i32 code,              /*处理结果代码 200_成功 500_失败*/
    2: string msg,            /*处理结果提示信息*/
    3: string rtmpPlayUrl,    /*rtmp播放URL*/
    4: string wsFlvPlayUrl,   /*flv播放URL*/
    5: PlayProtocol protocol, /* 播放协议 */
}

/*被清理的无人观看的流信息*/
struct CleanStreamWithNoneVisitorResponse {
    1: i32 code,
    2: string msg,
    3: list<string> allCleanedPlayUrl,
}

struct ModifyParam {
    1: string deviceSipID,              //设备ID
    2: VideoStreamMode videoStreamMode, //视频推流方式 1_RTSP 2_SDK 3_ISUP(EHOME)
    3: IPCType ipcType,                 //设备IPC类型
    4: bool isDirectConnect,            //是否直连 1_直连 0_间接连接
    5: i32 channelID,                   //设备通道号
    6: i32 parentChannel,               //父级通道号
    7: string parentSipID,              //父级设备ID
    8: string protocVersion,            //协议版本
    9: string connectSolutionID,        //接入方案ID
    10: string deviceName,              //设备名称
}

/*实时流信息*/
struct RealStreamInfo {
    1: string deviceSipID,
    2: i32 channelID,          //设备通道号
    3: string rtmpPlayUrl,     //rtmp播放URL
    4: string wsFlvPlayUrl,    //flv播放URL 
    5: PlayProtocol protocol,  //播放协议
}

/**设备SKD封装*/
service Device {

    /**获取备用的设备接入信息*/

    //DeviceSetupHelpInfoResponse getDeviceSetupHelpInfo(1: DeviceSetupHelpInfoRequest param),

    /**添加或者修改设备连接信息*/

    //CommonResponse2 setupDevice(1: DeviceSetupRequest param),

    /**连接设备，设备被动连接，非国标*/

    //ConnectDeviceResponse connectDevice(1: DeviceConnectRequest param),

    /**实时预览请求*/
    ConnectDeviceResponse getRealPlay(1: RealPlayParamParam param),

    /**停止预览请求*/
    CommonResponse2 stopRealPlay(1: RealPlayParamParam param),

    /* 视频流跳转 */
    CommonResponse2 streamOffset(1: PlayBackParam param),

    /* 视频流倍速 */
    CommonResponse2 streamScale(1: PlayBackParam param),

    /*历史视音频回放*/
    ConnectDeviceResponse playBackByTime(1: PlayBackParam param),

    /*历史文件下载*/
    CommonResponse2 RecordFileDownloadByTime(1: PlayBackParam param),

    /**设备注册*/
    CommonResponse2 deviceLogin(1: DeviceLoginInfo param, 2: string sipId, 3: string tid),

    /**设备注销*/
    CommonResponse2 deviceLogout(1: DeviceDisConnectParam param),

    /**设备断开连接，设备被动连接，非国标*/
    CleanStreamWithNoneVisitorResponse cleanStreamWithNoneVisitor(1: string tid),

    /**设置回调，接入中心将向回调的地址端口转发心跳信息*/

    //CommonResponse2 setHeartBeatCallback(1: HeartBeatCallbackParam param),

    /*设备控制*/

    //CommonResponse2 deviceControlCmd(1: DeviceControl ctrl),

    /*云台通用控制*/
    CommonResponse2 ptzControlDevice(1: PTZControl ctrl),

    /*云台预置点操作*/
    CommonResponse2 ptzPresetControlDevice(1: PTZPresetControl ctrl),

    /*云台巡航控制*/
    CommonResponse2 ptzCruiseControlDevice(1: CruiseControlParam ctrl),

    /* 设备布防 */
    CommonResponse2 guardControllDevice(1: ModifyParam deviceInfo, 2: bool isCancel, 3: string tid),

    // /*报警订阅*/
    // CommonResponse2 alarmSubscribe(1: AlarmParam param),

    /*报警事件分发和通知*/

    //AlarmEvent alarmEventNotifyAndDispatcher(1: string tid),

    /*设备信息查询*/
    DeviceInfo deviceInfoQuery(1: string deviceSipID, 2: string tid),

    /*设备状态信息查询*/
    DeviceStatusInfo deviceStatusInfoQuery(1: string deviceSipID, 2: string tid),

    /*设备预置位信息查询*/
    PresetQueryResponse devicePresetInfoQuery(1: string deviceSipID, 2: i32 channel, 3: string tid),

    /* 设备历史视频列表查询 */
    QueryHisFilelistResponse DeviceHistoryListQuery(1: PlayBackParam param),

    /*事件订阅*/
    CommonResponse2 UpdateSubscription(1: SubscribeType subType, 2: list<SubscribeParam> subscribeList, 3: string tid),

    /*通知事件*/
    //CommonResponse2 NotifyEvent(1: SubscribeType subType, 2: string tid),

    /*获取所有性能测试相关的log*/
    list<string> getPerfLogs(),

    /*修改设备信息*/
    CommonResponse2 modifyDeviceInfo(1: ModifyParam oldParam, 2: ModifyParam newParam, 3: string tid),

    /*获取正在推的实时流信息列表*/
    list<RealStreamInfo> getRealStreamlist(1: string connectID, 2: string tid);
}